﻿#pragma once
#ifndef WRWORKDAEMON_H
#define WRWORKDAEMON_H

#include "WRGlobal.h"
#include "WRWorkDeviceCollection.h"
#include "WRWorkObjectCollection.h"

#include <QString>
#include <QAtomicInt>
#include <QDomElement>

//表示工作域类。
class WRWorkDomain;

//表示工作程序。
class WRSOFT_WORKING_COMMON_CLASS WRWorkDaemon
{
private:
    //引用计数。
    QAtomicInt m_refCnt;

    //工作设备集合。
    WRArray<WRWorkDriver*> m_drivers;
    //工作设备集合。
    WRWorkDeviceCollection m_devices;

    //工作模块集合。
    WRArray<WRWorkModule*> m_modules;
    //工作对象集合。
    WRWorkObjectCollection m_objects;

    //工作域集合。
    WRArray<WRWorkDomain*> m_domains;

    //释放当前对象所占用的相关资源。
    ~WRWorkDaemon();

    //禁用复制构造函数和赋值操作符。
    Q_DISABLE_COPY(WRWorkDaemon)

    //初始化工作设备 。
    void initDevices(const QDomElement& config);
    //初始化工作对象。
    void initObjects(const QDomElement& config);
    //初始化工作域。
    void initDomains(const QDomElement& config);

    //执行相应的初始化处理。
    void initialize(const QDomElement& config);
    //执行相应的初始化处理。
    void initialize(const QString& configFileName);

public:
    //初始化工作程序。
    WRWorkDaemon(void);
    //执行相应的初始化处理。
    explicit WRWorkDaemon(const QDomElement& config);
    //初始化工作程序。
    explicit WRWorkDaemon(const QString& configFileName);

    //添加对象引用。
    inline void addRef(void)
    {
        m_refCnt.ref();
    }
    //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
    inline bool release(void)
    {
        if (!m_refCnt.deref())
        {
            delete this;
            return true;
        }
        return false;
    }

    //获取工作驱动集合。
    inline const WRArray<WRWorkDriver*>& drivers(void) const
    {
        return m_drivers;
    }

    //获取工作设备集合。
    inline const WRWorkDeviceCollection& devices(void) const
    {
        return m_devices;
    }
    //获取指定类型的设备集合。
    inline const WRArray<WRWorkDevice*>& filterDevices(const QUuid& tuid) const
    {
        return m_devices.filter(tuid);
    }
    //获取指定类型的设备集合。
    inline const WRArray<WRWorkDevice*>& filterDevices(WRType* type = 0) const
    {
        return m_devices.filter(type);
    }

    //获取工作对象集合。
    inline const WRWorkObjectCollection& objects(void) const
    {
        return m_objects;
    }
    //获取指定类型的对象集合。
    inline const WRArray<WRWorkObject*>& filterObjects(const QUuid& tuid) const
    {
        return m_objects.filter(tuid);
    }
    //获取指定类型的对象集合。
    inline const WRArray<WRWorkObject*>& filterObjects(WRType* type = 0) const
    {
        return m_objects.filter(type);
    }

    //获取工作域集合。
    inline const WRArray<WRWorkDomain*>& domains(void) const
    {
        return m_domains;
    }
};

#endif // WRWORKDAEMON_H
